package com.qdhh.enrollment.config;

import cn.dev33.satoken.interceptor.SaInterceptor;
import cn.dev33.satoken.router.SaRouter;
import cn.dev33.satoken.stp.StpUtil;
import cn.dev33.satoken.spring.SpringMVCUtil;
import com.qdhh.enrollment.security.IdentityVerificationInterceptor;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

/**
 * Sa-Token 配置类
 * 配置拦截规则和权限验证
 */
@Configuration
public class SaTokenConfig implements WebMvcConfigurer {

    private final IdentityVerificationInterceptor identityVerificationInterceptor;

    public SaTokenConfig(IdentityVerificationInterceptor identityVerificationInterceptor) {
        this.identityVerificationInterceptor = identityVerificationInterceptor;
    }

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        // 注册 Sa-Token 拦截器，定义认证校验规则
        registry.addInterceptor(new SaInterceptor(handler -> {
            // 排除 OPTIONS 预检请求（CORS）
            if ("OPTIONS".equals(SpringMVCUtil.getRequest().getMethod())) {
                return;
            }
            // 指定需要校验的路径
            SaRouter.match("/**")
                    // 排除不需要校验的路径
                    // 健康检查和状态接口
                    .notMatch("/api/service/status")
                    .notMatch("/api/health")
                    // 小程序登录和注册接口
                    .notMatch("/api/miniapp/user/login")
                    .notMatch("/api/miniapp/user/register")
                    .notMatch("/api/miniapp/profile/register")
                    // 管理员登录接口，无需认证
                    .notMatch("/api/admin/auth/login")
                    // 小程序公开数据接口（首页使用）
                    .notMatch("/api/miniapp/milestones")
                    .notMatch("/api/miniapp/faqs")
                    .notMatch("/api/miniapp/guides")
                    // 兼容旧路径（逐步废弃）
                    .notMatch("/api/user/login")
                    .notMatch("/api/register")
                    .notMatch("/api/milestones")
                    .notMatch("/api/milestone")
                    .notMatch("/api/faqs")
                    .notMatch("/api/guides")
                    // 错误页面
                    .notMatch("/error")
                    // 静态资源
                    .notMatch("/static/**")
                    .notMatch("/css/**")
                    .notMatch("/js/**")
                    .notMatch("/images/**")
                    // API 文档相关（Knife4j/Swagger）
                    .notMatch("/doc.html")
                    .notMatch("/doc.html/**")
                    .notMatch("/swagger-ui/**")
                    .notMatch("/swagger-ui.html")
                    .notMatch("/v3/api-docs/**")
                    .notMatch("/webjars/**")
                    .notMatch("/favicon.ico")
                    // 校验登录状态
                    // 注意：如果请求没有token或token格式错误（如缺少Bearer前缀），
                    // Sa-Token会抛出NotLoginException，这会被统一异常处理器转换为401响应
                    .check(r -> StpUtil.checkLogin());
        })).addPathPatterns("/**");
        
        // 注册身份认证拦截器（在 Sa-Token 拦截器之后执行）
        registry.addInterceptor(identityVerificationInterceptor).addPathPatterns("/**");
    }

    /**
     * 配置CORS跨域
     * 允许前端（Vue）和小程序访问后端API
     */
    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**")
                // 允许的前端域名
                .allowedOriginPatterns("*")
                // 允许的请求方法
                .allowedMethods("GET", "POST", "PUT", "DELETE", "OPTIONS", "PATCH")
                // 允许的请求头
                .allowedHeaders("*")
                // 是否允许携带Cookie
                .allowCredentials(true)
                // 预检请求的有效期（秒）
                .maxAge(3600);
    }
}

